{
  "id" : 1,
  "name" : "Сервис поиска попутчиков",
  "description" : "Яндекс.Go, только на божественных шарпах",
  "lastModifiedDate" : "2024-03-10T19:48:18Z",
  "properties" : {
    "structurizr.dsl" : "d29ya3NwYWNlIHsKCiAgICBuYW1lICLQodC10YDQstC40YEg0L/QvtC40YHQutCwINC/0L7Qv9GD0YLRh9C40LrQvtCyIgogICAgZGVzY3JpcHRpb24gItCv0L3QtNC10LrRgS5Hbywg0YLQvtC70YzQutC+INC90LAg0LHQvtC20LXRgdGC0LLQtdC90L3Ri9GFINGI0LDRgNC/0LDRhSIKICAgICFhZHJzIGRlY2lzaW9ucwogICAgIWRvY3MgZG9jdW1lbnRhdGlvbgogICAgIWlkZW50aWZpZXJzIGhpZXJhcmNoaWNhbAogICAgIWltcGxpZWRSZWxhdGlvbnNoaXBzIHRydWUKCiAgICBtb2RlbCB7CiAgICAgICAgYnVzaW5lc3NVc2VyID0gcGVyc29uICJCdXNpbmVzcyBVc2VyIiAiQSByZWd1bGFyIGJ1c2luZXNzIHVzZXIuIgogICAgICAgIGNvbmZpZ3VyYXRpb25Vc2VyID0gcGVyc29uICJDb25maWd1cmF0aW9uIFVzZXIiICJBIHJlZ3VsYXIgYnVzaW5lc3MgdXNlciB3aG8gY2FuIGFsc28gY29uZmlndXJlIHRoZSBwYXJhbWV0ZXJzIHVzZWQgaW4gdGhlIHJpc2sgY2FsY3VsYXRpb25zLiIKCiAgICAgICAgZmluYW5jaWFsUmlza1N5c3RlbSA9IHNvZnR3YXJlU3lzdGVtICJGaW5hbmNpYWwgUmlzayBTeXN0ZW0iICJDYWxjdWxhdGVzIHRoZSBiYW5rJ3MgZXhwb3N1cmUgdG8gcmlzayBmb3IgcHJvZHVjdCBYLiIgIkZpbmFuY2lhbCBSaXNrIFN5c3RlbSIgIAoKICAgICAgICB0cmFkZURhdGFTeXN0ZW0gPSBzb2Z0d2FyZVN5c3RlbSAiVHJhZGUgRGF0YSBTeXN0ZW0iICJUaGUgc3lzdGVtIG9mIHJlY29yZCBmb3IgdHJhZGVzIG9mIHR5cGUgWC4iCiAgICAgICAgcmVmZXJlbmNlRGF0YVN5c3RlbSA9IHNvZnR3YXJlU3lzdGVtICJSZWZlcmVuY2UgRGF0YSBTeXN0ZW0iICJNYW5hZ2VzIHJlZmVyZW5jZSBkYXRhIGZvciBhbGwgY291bnRlcnBhcnRpZXMgdGhlIGJhbmsgaW50ZXJhY3RzIHdpdGguIgogICAgICAgIHJlZmVyZW5jZURhdGFTeXN0ZW1WMiA9IHNvZnR3YXJlU3lzdGVtICJSZWZlcmVuY2UgRGF0YSBTeXN0ZW0gdjIuMCIgIk1hbmFnZXMgcmVmZXJlbmNlIGRhdGEgZm9yIGFsbCBjb3VudGVycGFydGllcyB0aGUgYmFuayBpbnRlcmFjdHMgd2l0aC4iICJGdXR1cmUgU3RhdGUiCiAgICAgICAgZW1haWxTeXN0ZW0gPSBzb2Z0d2FyZVN5c3RlbSAiRS1tYWlsIHN5c3RlbSIgIlRoZSBiYW5rJ3MgTWljcm9zb2Z0IEV4Y2hhbmdlIHN5c3RlbS4iCiAgICAgICAgY2VudHJhbE1vbml0b3JpbmdTZXJ2aWNlID0gc29mdHdhcmVTeXN0ZW0gIkNlbnRyYWwgTW9uaXRvcmluZyBTZXJ2aWNlIiAiVGhlIGJhbmsncyBjZW50cmFsIG1vbml0b3JpbmcgYW5kIGFsZXJ0aW5nIGRhc2hib2FyZC4iCiAgICAgICAgYWN0aXZlRGlyZWN0b3J5ID0gc29mdHdhcmVTeXN0ZW0gIkFjdGl2ZSBEaXJlY3RvcnkiICJUaGUgYmFuaydzIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3Jpc2F0aW9uIHN5c3RlbS4iCgogICAgICAgIGJ1c2luZXNzVXNlciAtPiBmaW5hbmNpYWxSaXNrU3lzdGVtICJWaWV3cyByZXBvcnRzIHVzaW5nIgogICAgICAgIGZpbmFuY2lhbFJpc2tTeXN0ZW0gLT4gdHJhZGVEYXRhU3lzdGVtICJHZXRzIHRyYWRlIGRhdGEgZnJvbSIKICAgICAgICBmaW5hbmNpYWxSaXNrU3lzdGVtIC0+IHJlZmVyZW5jZURhdGFTeXN0ZW0gIkdldHMgY291bnRlcnBhcnR5IGRhdGEgZnJvbSIKICAgICAgICBmaW5hbmNpYWxSaXNrU3lzdGVtIC0+IHJlZmVyZW5jZURhdGFTeXN0ZW1WMiAiR2V0cyBjb3VudGVycGFydHkgZGF0YSBmcm9tIiAiIiAiRnV0dXJlIFN0YXRlIgogICAgICAgIGNvbmZpZ3VyYXRpb25Vc2VyIC0+IGZpbmFuY2lhbFJpc2tTeXN0ZW0gIkNvbmZpZ3VyZXMgcGFyYW1ldGVycyB1c2luZyIKICAgICAgICBmaW5hbmNpYWxSaXNrU3lzdGVtIC0+IGVtYWlsU3lzdGVtICJTZW5kcyBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgcmVwb3J0IGlzIHJlYWR5IHRvIgogICAgICAgIGVtYWlsU3lzdGVtIC0+IGJ1c2luZXNzVXNlciAiU2VuZHMgYSBub3RpZmljYXRpb24gdGhhdCBhIHJlcG9ydCBpcyByZWFkeSB0byIgIkUtbWFpbCBtZXNzYWdlIiAiQXN5bmNocm9ub3VzIgogICAgICAgIGZpbmFuY2lhbFJpc2tTeXN0ZW0gLT4gY2VudHJhbE1vbml0b3JpbmdTZXJ2aWNlICJTZW5kcyBjcml0aWNhbCBmYWlsdXJlIGFsZXJ0cyB0byIgIlNOTVAiICJBc3luY2hyb25vdXMsIEFsZXJ0IgogICAgICAgIGZpbmFuY2lhbFJpc2tTeXN0ZW0gLT4gYWN0aXZlRGlyZWN0b3J5ICJVc2VzIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3Jpc2F0aW9uIgogICAgfQoKICAgIHZpZXdzIHsKCiAgICAgICAgc3lzdGVtQ29udGV4dCBmaW5hbmNpYWxSaXNrU3lzdGVtICJDb250ZXh0IiAiQW4gZXhhbXBsZSBTeXN0ZW0gQ29udGV4dCBkaWFncmFtIGZvciB0aGUgRmluYW5jaWFsIFJpc2sgU3lzdGVtIGFyY2hpdGVjdHVyZSBrYXRhLiIgewogICAgICAgICAgICBpbmNsdWRlICoKICAgICAgICAgICAgYXV0b0xheW91dAogICAgICAgIH0KICAgICAgICB0aGVtZSBodHRwczovL3N0YXRpYy5zdHJ1Y3R1cml6ci5jb20vdGhlbWVzL21pY3Jvc29mdC1henVyZS0yMDIxLjAxLjI2L3RoZW1lLmpzb24KICAgICAgICBicmFuZGluZyB7CiAgICAgICAgICAgIGxvZ28gaHR0cHM6Ly9tYWkucnUvcHJlc3MvYnJhbmQvZG93bmxvYWQvSW52ZXJzZS9FTkcvSW52ZXJzZSUyMGVuZy5wbmcKICAgICAgICB9CiAgICB9CgogICAgY29uZmlndXJhdGlvbiB7CiAgICAgICAgc2NvcGUgc29mdHdhcmVzeXN0ZW0KICAgIH0KfQo="
  },
  "configuration" : {
    "scope" : "SoftwareSystem"
  },
  "model" : {
    "people" : [ {
      "id" : "1",
      "tags" : "Element,Person",
      "properties" : {
        "structurizr.dsl.identifier" : "businessuser"
      },
      "name" : "Business User",
      "description" : "A regular business user.",
      "relationships" : [ {
        "id" : "10",
        "tags" : "Relationship",
        "properties" : {
          "structurizr.dsl.identifier" : "4cfcaf25-93fb-4092-a4d6-139fb74fb6f9"
        },
        "sourceId" : "1",
        "destinationId" : "3",
        "description" : "Views reports using"
      } ],
      "location" : "Unspecified"
    }, {
      "id" : "2",
      "tags" : "Element,Person",
      "properties" : {
        "structurizr.dsl.identifier" : "configurationuser"
      },
      "name" : "Configuration User",
      "description" : "A regular business user who can also configure the parameters used in the risk calculations.",
      "relationships" : [ {
        "id" : "14",
        "tags" : "Relationship",
        "properties" : {
          "structurizr.dsl.identifier" : "7e0f059e-5256-4bce-b0db-5f924bf73560"
        },
        "sourceId" : "2",
        "destinationId" : "3",
        "description" : "Configures parameters using"
      } ],
      "location" : "Unspecified"
    } ],
    "softwareSystems" : [ {
      "id" : "3",
      "tags" : "Element,Software System,Financial Risk System",
      "properties" : {
        "structurizr.dsl.identifier" : "financialrisksystem"
      },
      "name" : "Financial Risk System",
      "description" : "Calculates the bank's exposure to risk for product X.",
      "relationships" : [ {
        "id" : "11",
        "tags" : "Relationship",
        "properties" : {
          "structurizr.dsl.identifier" : "6508ff29-bc08-4dca-a4d5-49173a2312d5"
        },
        "sourceId" : "3",
        "destinationId" : "4",
        "description" : "Gets trade data from"
      }, {
        "id" : "12",
        "tags" : "Relationship",
        "properties" : {
          "structurizr.dsl.identifier" : "85f2951c-1616-4ebd-957b-489492b87939"
        },
        "sourceId" : "3",
        "destinationId" : "5",
        "description" : "Gets counterparty data from"
      }, {
        "id" : "13",
        "tags" : "Relationship,Future State",
        "properties" : {
          "structurizr.dsl.identifier" : "7e083a18-bec9-4627-894c-c2fab9cdce95"
        },
        "sourceId" : "3",
        "destinationId" : "6",
        "description" : "Gets counterparty data from"
      }, {
        "id" : "15",
        "tags" : "Relationship",
        "properties" : {
          "structurizr.dsl.identifier" : "141ce824-5bed-4a6c-ad53-424ec9d4262a"
        },
        "sourceId" : "3",
        "destinationId" : "7",
        "description" : "Sends a notification that a report is ready to"
      }, {
        "id" : "17",
        "tags" : "Relationship,Asynchronous,Alert",
        "properties" : {
          "structurizr.dsl.identifier" : "812c4638-350b-4552-aa83-1c06fc995d0b"
        },
        "sourceId" : "3",
        "destinationId" : "8",
        "description" : "Sends critical failure alerts to",
        "technology" : "SNMP"
      }, {
        "id" : "18",
        "tags" : "Relationship",
        "properties" : {
          "structurizr.dsl.identifier" : "5d815d7c-031e-4dd7-a4d7-79f0a7d8f81f"
        },
        "sourceId" : "3",
        "destinationId" : "9",
        "description" : "Uses for user authentication and authorisation"
      } ],
      "location" : "Unspecified",
      "documentation" : { }
    }, {
      "id" : "4",
      "tags" : "Element,Software System",
      "properties" : {
        "structurizr.dsl.identifier" : "tradedatasystem"
      },
      "name" : "Trade Data System",
      "description" : "The system of record for trades of type X.",
      "location" : "Unspecified",
      "documentation" : { }
    }, {
      "id" : "5",
      "tags" : "Element,Software System",
      "properties" : {
        "structurizr.dsl.identifier" : "referencedatasystem"
      },
      "name" : "Reference Data System",
      "description" : "Manages reference data for all counterparties the bank interacts with.",
      "location" : "Unspecified",
      "documentation" : { }
    }, {
      "id" : "6",
      "tags" : "Element,Software System,Future State",
      "properties" : {
        "structurizr.dsl.identifier" : "referencedatasystemv2"
      },
      "name" : "Reference Data System v2.0",
      "description" : "Manages reference data for all counterparties the bank interacts with.",
      "location" : "Unspecified",
      "documentation" : { }
    }, {
      "id" : "7",
      "tags" : "Element,Software System",
      "properties" : {
        "structurizr.dsl.identifier" : "emailsystem"
      },
      "name" : "E-mail system",
      "description" : "The bank's Microsoft Exchange system.",
      "relationships" : [ {
        "id" : "16",
        "tags" : "Relationship,Asynchronous",
        "properties" : {
          "structurizr.dsl.identifier" : "bc17431b-5cd8-4ec2-9ae2-26b73bf321f3"
        },
        "sourceId" : "7",
        "destinationId" : "1",
        "description" : "Sends a notification that a report is ready to",
        "technology" : "E-mail message"
      } ],
      "location" : "Unspecified",
      "documentation" : { }
    }, {
      "id" : "8",
      "tags" : "Element,Software System",
      "properties" : {
        "structurizr.dsl.identifier" : "centralmonitoringservice"
      },
      "name" : "Central Monitoring Service",
      "description" : "The bank's central monitoring and alerting dashboard.",
      "location" : "Unspecified",
      "documentation" : { }
    }, {
      "id" : "9",
      "tags" : "Element,Software System",
      "properties" : {
        "structurizr.dsl.identifier" : "activedirectory"
      },
      "name" : "Active Directory",
      "description" : "The bank's authentication and authorisation system.",
      "location" : "Unspecified",
      "documentation" : { }
    } ]
  },
  "documentation" : {
    "sections" : [ {
      "content" : "# Сервис поиска попутчиков\r\n\r\n## Введение\r\n\r\nЭтот проект представляет собой веб-приложение для поиска попутчиков, аналогичное сервису \"Яндекс.Go\".\r\nПриложение позволяет пользователям создавать профили, добавлять маршруты путешествий и создавать поездки, к которым могут присоединяться другие пользователи.\r\n\r\n## Контекст\r\n\r\nСистема поиска попутчиков: Это основная система, которая предоставляет функциональность по поиску попутчиков, созданию профилей пользователей, управлению маршрутами и поездками.\r\n\r\n![](embed:Context)",
      "format" : "Markdown",
      "filename" : "context.md",
      "order" : 1,
      "title" : ""
    }, {
      "content" : "## Функциональные требования к системе\r\n\r\nПроект должен реализовывать следующие API:\r\n\r\n- Создание нового пользователя\r\n- Поиск пользователя по логину\r\n- Поиск пользователя по маске имени и фамилии\r\n- Создание маршрута\r\n- Получение маршрутов пользователя\r\n- Создание поездки\r\n- Подключение пользователей к поездке\r\n- Получение информации о поездке",
      "format" : "Markdown",
      "filename" : "functional-overview.md",
      "order" : 2,
      "title" : ""
    }, {
      "content" : "## Качественные требования\r\n\r\nКачественные требования определяют ожидаемые свойства и характеристики проекта, которые обеспечивают его эффективную работу, удобство использования и надежность. Вот некоторые качественные требования, которые могут быть предъявлены к проекту \"Сервис поиска попутчиков\"\r\n\r\n### **Надежность**\r\nСистема должна быть стабильной и работоспособной даже при высоких нагрузках. Должны быть предусмотрены механизмы резервного копирования данных и восстановления системы после сбоев.\r\n\r\n### **Безопасность**\r\nДолжны быть реализованы меры по защите пользовательских данных, таких как хэширование паролей, защита от инъекций и атак перебора паролей. Система должна обеспечивать аутентификацию и авторизацию пользователей с использованием безопасных методов.\r\n\r\n### **Производительность**\r\nСистема должна обеспечивать высокую скорость ответа на запросы пользователей. Например, система должна поддерживать обработку не менее **1000 запросов в секунду (RPS)** с временем отклика не более 100 миллисекунд. Также требуется достижение **SLA** на уровне 99.9% для времени отклика системы.\r\n\r\n### **Масштабируемость**\r\nСистема должна быть легко масштабируемой и гибкой для обработки роста количества пользователей и данных, а также для добавления новых функций и модулей. Должны быть реализованы механизмы автоматического масштабирования, такие как горизонтальное масштабирование и использование облачных ресурсов.\r\n\r\n### **Отказоустойчивость**\r\nСистема должна быть способной обрабатывать сбои и отказы в работе компонентов без прерывания обслуживания пользователей. Должны быть предусмотрены механизмы обработки и восстановления после отказов.\r\n\r\n### **Observability**\r\nСистема должна обеспечивать возможность наблюдения и мониторинга своего состояния и работы, включая логирование событий, метрики производительности и трассировку запросов. Должны быть предоставлены инструменты для анализа данных и выявления проблем в работе системы, включая метрики для отслеживания производительности, такие как количество запросов в секунду (RPS), время отклика, загрузка сервера и использование ресурсов.\r\n",
      "format" : "Markdown",
      "filename" : "quality-attributes.md",
      "order" : 3,
      "title" : ""
    } ],
    "decisions" : [ {
      "content" : "# 1. Выбор технологий для логики бекенда\n\nDate: 2024-02-29\n\n## Status\n\nAccepted\n\n## Context\n\nНеобходимо выбрать фреймворк для реализации бэкенда приложения.\n\n## Decision\n\nРассматриваемые варианты:\n1. Node.js\n2. Django\n3. Go\n4. ASP.NET\n\n### Плюсы решения 1:\n\nВысокая скорость разработки, эффективность в работе с вводом-выводом, единая языковая среда.\n\n### Минусы решения 1:\n\nОднопоточность, сложности при работе с CPU-bound задачами, возможные проблемы с некоторыми модулями.\n\n\n### Плюсы решения 2:\n\nИнтуитивно понятная структура, обширное сообщество и поддержка, интеграция с Python.\n\n### Минусы решения 2:\n\nБолее сложное изучение для новичков, меньшая популярность в веб-разработке на C#, возможные проблемы с производительностью при больших нагрузках.\n\n### Плюсы решения 3:\n\nВысокая производительность и эффективность, простота разработки, многопоточная поддержка.\n\n### Минусы решения 3:\n\nОграниченный выбор библиотек и фреймворков для веб-разработки, возможные сложности с поиском и интеграцией необходимых решений, меньшая распространенность и сообщество по сравнению с некоторыми другими языками.\n\n\n### Плюсы решения 4:\n\nНадежность и производительность, поддержка языка C#, обширное сообщество и богатая документация.\n\n\n### Минусы решения 4:\n\nМеньшая гибкость, возможно более высокий порог вхождения для новичков, ограничения в выборе операционных систем и хостинг-провайдеров.\n\n\n### Выбирается решение 1\n\n## Consequences\n\nПридется писать на божественных шарпах((((\n",
      "format" : "Markdown",
      "id" : "1",
      "title" : "Выбор технологий для логики бекенда",
      "date" : "2024-02-29T00:00:00Z",
      "status" : "Accepted"
    }, {
      "content" : "# 2. Record architecture decisions\n\nDate: 2024-03-29\n\n## Status\n\nAccepted\n\n## Context\n\nДля хранения информации о клиентах, совершаемых платежах, подписках и т.д. необходимо зранить информацию в долговременном носителе;\n\n## Decision\n\nРассматриваемые варианты:\n1. SQL хранилище на основе PostgreSQL 14\n2. NoSQL хранилище на основе MongoDB\n3. SQL хранилище на основе MS SQL Server 2022\n\n**Плюсы решения 1:**\nВозможность совершать запросы к хранилищу по различным критериям (поиск всех клиентов с неоплачеными счетами, различные критерии выбора клиентов и т.д.)\n\n**Минусы решения 1:**\nНеобходимо заранее продумать модель данных, критерии индексирования. Будет затруднено хранение слабоструктурированных данных. Для построения кластера нужно применять внешнее решение (patroni)\n\n**Плюсы решения 2:**\nВозможность менять/расширять модель зранения данных. Высокопроизводительные запросы по ключевым полям. Возможность построения кластера (из коробки)\n\n**Минусы решения 2:**\nПроизвольные запросы по связанным сущностям, будут не так эффективны.\n\n**Плюсы решения 3:**\nВозможность менять/расширять модель зранения данных. Высокопроизводительные запросы по ключевым полям. Возможность построения кластера (из коробки)\n\n**Минусы решения 3:**\nПроизвольные запросы по связанным сущностям, будут не так эффективны.\n\n**Выбирается решение 1**\n\n## Consequences\n\nДля обеспечения отказоустойчивости необходимо отдельно разворачивать кластер на patroni.\n",
      "format" : "Markdown",
      "id" : "2",
      "title" : "Record architecture decisions",
      "date" : "2024-03-29T00:00:00Z",
      "status" : "Accepted"
    }, {
      "content" : "# 3. Caching\n\nDate: 2024-03-09\n\n## Status\n\nAccepted\n\n## Context\n\nДля хранения информации о клиентах, совершаемых платежах, подписках и т.д. необходимо зранить информацию в долговременном носителе;\n\n## Decision\n\nРассматриваемые варианты:\n1. SQL хранилище на основе PostgreSQL 14\n2. NoSQL хранилище на основе MongoDB\n3. SQL хранилище на основе MS SQL Server 2022\n\n**Плюсы решения 1:**\nВозможность совершать запросы к хранилищу по различным критериям (поиск всех клиентов с неоплачеными счетами, различные критерии выбора клиентов и т.д.)\n\n**Минусы решения 1:**\nНеобходимо заранее продумать модель данных, критерии индексирования. Будет затруднено хранение слабоструктурированных данных. Для построения кластера нужно применять внешнее решение (patroni)\n\n**Плюсы решения 2:**\nВозможность менять/расширять модель зранения данных. Высокопроизводительные запросы по ключевым полям. Возможность построения кластера (из коробки)\n\n**Минусы решения 2:**\nПроизвольные запросы по связанным сущностям, будут не так эффективны.\n\n**Плюсы решения 3:**\nВозможность менять/расширять модель зранения данных. Высокопроизводительные запросы по ключевым полям. Возможность построения кластера (из коробки)\n\n**Минусы решения 3:**\nПроизвольные запросы по связанным сущностям, будут не так эффективны.\n\n**Выбирается решение 1**\n\n## Consequences\n\nДля обеспечения отказоустойчивости необходимо отдельно разворачивать кластер на patroni.\n",
      "format" : "Markdown",
      "id" : "3",
      "title" : "Caching",
      "date" : "2024-03-09T00:00:00Z",
      "status" : "Accepted"
    }, {
      "content" : "# 4. dotnet project architecture\n\nDate: 2024-03-09\n\n## Status\n\nAccepted\n\n## Context\n\nThe issue motivating this decision, and any context that influences or constrains the decision.\n\n## Decision\n\nThe change that we're proposing or have agreed to implement.\n\n## Consequences\n\nWhat becomes easier or more difficult to do and any risks introduced by the change that will need to be mitigated.\n",
      "format" : "Markdown",
      "id" : "4",
      "title" : "dotnet project architecture",
      "date" : "2024-03-09T00:00:00Z",
      "status" : "Accepted"
    }, {
      "content" : "# 5. service naming\n\nDate: 2024-03-09\n\n## Status\n\nAccepted\n\n## Context\n\nThe issue motivating this decision, and any context that influences or constrains the decision.\n\n## Decision\n\nThe change that we're proposing or have agreed to implement.\n\n## Consequences\n\nWhat becomes easier or more difficult to do and any risks introduced by the change that will need to be mitigated.\n",
      "format" : "Markdown",
      "id" : "5",
      "title" : "service naming",
      "date" : "2024-03-09T00:00:00Z",
      "status" : "Accepted"
    } ]
  },
  "views" : {
    "systemContextViews" : [ {
      "key" : "Context",
      "order" : 1,
      "description" : "An example System Context diagram for the Financial Risk System architecture kata.",
      "softwareSystemId" : "3",
      "automaticLayout" : {
        "implementation" : "Graphviz",
        "rankDirection" : "TopBottom",
        "rankSeparation" : 300,
        "nodeSeparation" : 300,
        "edgeSeparation" : 0,
        "vertices" : false,
        "applied" : false
      },
      "enterpriseBoundaryVisible" : true,
      "elements" : [ {
        "id" : "1",
        "x" : 0,
        "y" : 0
      }, {
        "id" : "2",
        "x" : 0,
        "y" : 0
      }, {
        "id" : "3",
        "x" : 0,
        "y" : 0
      }, {
        "id" : "4",
        "x" : 0,
        "y" : 0
      }, {
        "id" : "5",
        "x" : 0,
        "y" : 0
      }, {
        "id" : "6",
        "x" : 0,
        "y" : 0
      }, {
        "id" : "7",
        "x" : 0,
        "y" : 0
      }, {
        "id" : "8",
        "x" : 0,
        "y" : 0
      }, {
        "id" : "9",
        "x" : 0,
        "y" : 0
      } ],
      "relationships" : [ {
        "id" : "18"
      }, {
        "id" : "17"
      }, {
        "id" : "16"
      }, {
        "id" : "15"
      }, {
        "id" : "14"
      }, {
        "id" : "13"
      }, {
        "id" : "11"
      }, {
        "id" : "12"
      }, {
        "id" : "10"
      } ]
    } ],
    "configuration" : {
      "branding" : {
        "logo" : "https://mai.ru/press/brand/download/Inverse/ENG/Inverse%20eng.png"
      },
      "styles" : { },
      "themes" : [ "https://static.structurizr.com/themes/microsoft-azure-2021.01.26/theme.json" ],
      "terminology" : { },
      "lastSavedView" : "Context"
    }
  }
}